package com.ato.GenericTest;

/**
 * @author wangjing
 * @create 2021--12--07--21:30
 */

import org.junit.Test;

import java.util.*;

/**
 * 所谓泛型，就是允许在定义类，接口时，通过一个标识标识勒类中的某个属性的类型或者方法的返回值或者参数的类型，在继承或者实现，以及使用时，需要类型一致
 * JDK1.5之后引入
 * 解决：类型不安全，比如 要遍历后去做运算，那么就只能强转了再去，且强转时可能存在类型转换异常
 * 注意点：  需要使用包装类，不能是基本数据类型！！！！！！！
 *
 * 在定义类时，指明了泛型类型，那么在使用时，他里面的内部接口使用到的类型的泛型，在实例化时，都会是此类型
 *  泛型的类型必须是一个类   类型必须是包装类，如果没有指明，那么是java.lang.Object
 */
public class GenericTest1 {
    public static void main(String[] args) {

    }

    @Test
    public void test1() {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(123);// 如果没有限制，那么这里可以添加Object的，，就不一定是String 可以是数字啊
        arrayList.add(456);
        Iterator<Integer> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Integer val = iterator.next();
            val += 1;
            System.out.println(val);
        }
    }

    @Test
    public void test12() {
        HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
        stringIntegerHashMap.put("STRING", 2);
        stringIntegerHashMap.put("STRING1", 21);
        stringIntegerHashMap.put("STRING2", 22);
//        泛型嵌套
        Set<Map.Entry<String, Integer>> entries = stringIntegerHashMap.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()) {
//            next是每一个entry  entry里面包含key。value
            Map.Entry<String, Integer> next = iterator.next();
            String key = next.getKey();
            Integer value = next.getValue();
            System.out.println("key:" + key + "=>" + "value " + value);


        }


    }
}
